package com.cn.bdth.model;


import lombok.Data;

import java.util.List;

/**
 *  对应文档
 *
 *  https://cloud.baidu.com/doc/WENXINWORKSHOP/s/jlil56u11
 */
@Data
public class ERNIEBotModel {

    /**
     * messages	List(message)	是	聊天上下文信息。说明：
     * （1）messages成员不能为空，1个成员表示单轮对话，多个成员表示多轮对话
     * （2）最后一个message为当前请求的信息，前面的message为历史对话信息
     * （3）必须为奇数个成员，成员中message的role必须依次为user(or function)、assistant
     * （4）最后一个message的content长度（即此轮对话的问题）不能超过3000 token；如果messages中content总长度大于3000 token，系统会依次遗忘最早的历史会话，直到content的总长度不超过3000 token
     * functions	List(function)	否	一个可触发函数的描述列表
     * temperature	float	否	说明：
     * （1）较高的数值会使输出更加随机，而较低的数值会使其更加集中和确定
     * （2）默认0.95，范围 (0, 1.0]，不能为0
     * （3）建议该参数和top_p只设置1个
     * （4）建议top_p和temperature不要同时更改
     * top_p	float	否	说明：
     * （1）影响输出文本的多样性，取值越大，生成文本的多样性越强
     * （2）默认0.8，取值范围 [0, 1.0]
     * （3）建议该参数和temperature只设置1个
     * （4）建议top_p和temperature不要同时更改
     * penalty_score	float	否	通过对已生成的token增加惩罚，减少重复生成的现象。说明：
     * （1）值越大表示惩罚越大
     * （2）默认1.0，取值范围：[1.0, 2.0]
     * stream	bool	否	是否以流式接口的形式返回数据，默认false
     * system	string	否	模型人设，主要用于人设设定，例如，你是xxx公司制作的AI助手，说明：
     * （1）长度限制1024个字符
     * （2）如果使用functions参数，不支持设定人设system
     * user_id	string	否	表示最终用户的唯一标识符，可以监视和检测滥用行为，防止接口恶意调用
     */

    private List<Message>  messages;

    private List<Function> functions;

    private float temperature;

    private float topP;

    private float penaltyScore;

    private Boolean stream;

    private String system;

    private String userId;


    /**
     * message说明
     *
     * 名称	类型	必填	描述
     * role	string	是	当前支持以下：
     * user: 表示用户
     * assistant: 表示对话助手
     * function: 表示函数
     * content	string	是	对话内容，当前message存在function_call时可以为空，其他场景不能为空
     * name	string	否	message作者；当role=function时，必填，且是响应内容中function_call中的name
     * function_call	function_call	否	函数调用，function call场景下第一轮对话的返回，第二轮对话作为历史信息在message中传入
     */
    @Data
    public static class Message {
        private String role;

        private String content;

        private String name;

        private FunctionCall functionCall;
    }

    /**
     * function_call说明
     *
     * 名称	类型	必填	描述
     * name	string	是	触发的function名
     * arguments	string	是	请求参数
     * thoughts	string	否	模型思考过程
     */
    @Data
    public static class FunctionCall{
        private String name;

        private String arguments;

        private String thoughts;

    }

    /**
     * name	string	是	函数名
     * description	string	是	函数描述
     * parameters	object	是	函数请求参数，说明：
     * （1）JSON Schema 格式，参考JSON Schema描述
     * （2）如果函数没有请求参数，parameters值格式如下：
     * {"type": "object","properties": {}}
     * responses	object	否	函数响应参数，JSON Schema 格式，参考JSON Schema描述
     * examples	List(example)	否	function调用的一些历史示例
     */
    @Data
    public static class Function{
        private String name;

        private String description;

        private Object parameters;

        private Object responses;

        private List<Example> examples;

    }

    /**
     * example说明
     *
     * 名称	类型	必填	描述
     * role	string	是	当前支持以下：
     * user: 表示用户
     * assistant: 表示对话助手
     * function: 表示函数
     * content	string	是	对话内容，当前message存在function_call时可以为空，其他场景不能为空
     * name	string	否	message作者；当role=function时，必填，且是响应内容中function_call中的name
     * function_call	function_call	否	函数调用，function call场景下第一轮对话的返回，第二轮对话作为历史信息在message中传入
     */
    @Data
    public static class Example{
        private String role;

        private String content;

        private String name;

        private FunctionCall functionCall;
    }
}
